package utils

import (
	"reflect"
)

// 嵌套结构体转map
func StructToMap(obj interface{}) map[string]interface{} {

	// 当前函数只接收struct类型
	v := reflect.ValueOf(obj)    // 获取值
	if v.Kind() == reflect.Ptr { // 结构体指针
		v = v.Elem()
	}
	if v.Kind() != reflect.Struct {
		panic("not struct")
	}

	// 定义返回的数据
	result := make(map[string]interface{})

	typ := reflect.TypeOf(obj) // 获取类型信息

	for i := 0; i < typ.NumField(); i++ {
		field := typ.Field(i)                            // 获取字段信息
		tag := field.Tag.Get("structs")                  // 获取标签（如果有）
		if tag != "" && tag != "-" && !field.Anonymous { // 只处理非匿名字段且有标签的情况
			result[tag] = v.Field(i).Interface() // 存入Map
		} else if field.Anonymous {
			embeddedStruct := v.Field(i).Interface()
			embeddedResult := StructToMap(embeddedStruct)
			for key, val := range embeddedResult {
				result[key] = val
			}
		}
	}

	return result
}
